# -*- coding:utf-8 -*-
# 定义一个函数
"""
函数代码块以def关键词开头，后接函数标识符名称和圆括号()。
任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始，并且缩进。
return [表达式] 结束函数，选择性地返回一个值给调用方。不带表达式的return相当于返回 None
"""

# def func1():
#     print("我是一个自定义函数")
#
# # 调用函数：函数一但调用，将进入函数内部去执行。
# func1()

# 注意：在Python中，函数必须先定义后使⽤


# 函数的参数作用
# 必备参数
# 必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
# 调用demo()函数，你必须传入一个参数，不然会出现语法错误：
# def func2(a, b):
#     print("我是", a)
#     print("我是", b)
#
# # func2()        # 报错
# func2("张三", "李四")

# 函数是一种可以重复使用的代码片段，通过函数，我们可以减少冗余。
# def func2(a, b):
#     print(a+b)
#
# func2(2, 5)
# func2(10, 20)


# 关键字参数
# 关键字参数和函数调用关系紧密，函数调用使用关键字参数来确定传入的参数值
# def func3(name, age):
#     print(f"大家好, 我是{name}, 我今年{age}岁了")
#
# name = "张三"
# age = 18
# func3(age=age, name=name)    # 可以改变参数的顺序，只要改变传入的参数值即可
# func3(age, name)    # 这样是必备参数，会打印：大家好, 我是18, 我今年张三岁了


# 默认参数
# def func4(name="张三", age=18):
#     print(f"大家好, 我是{name}, 我今年{age}岁了")
#
# func4()            # 默认参数，调用时不传参，打印默认值
# func4("坤哥", 38)     # 传参，则覆盖默认参数


# 普通的传参
# def func5(name1, name2, name3):
#     print("这是", name1, name2, name3)
#
# func5("张三", "李四", "王五", "赵六")     # 实参多余形参，将报错


# 如何解决呢？ 可以使用不定长参数
# 不定长参数
# python自定义函数中有两种不定长参数，第一种是*XXX，
# 在传入额外的参数时可以不用指明参数名，直接传入参数值即可。
# 这种会以元组(tuple)的形式导入
# def func5(*args):
#     print("这是", args)
#
# func5("张三", "李四", "王五", "赵六")


# 第二种是**XXX，这种类型返回的是字典，传入时需要指定参数名。
def func5(*args, **kwargs):
    print("这是", args)
    print("这是", kwargs)


func5("张三", "李四", "王五", "赵六", 爱好="篮球", 年龄=18)
